// 分析一下各种情况
// 首先是先看开头和末尾
// 最开始和最后面的如果是f，那就只可能贡献一个或者0个价值
// 中间部分的f如果左右两边对应两个不同的字母，只有贡献一个一种情况，这种时候不用考虑
// 如果左右两边对应两个相同的字母，那可以贡献两个或者0个
// 
#include <iostream>
#include <string>
using namespace std;
const int N = 200010;
int n;
string s;
string str;

int main()
{
    cin >> n;
    cin >> s;
    str = s;
    // 求出公差
    int d = (s[0] == 'F' || s[n - 1] == 'F') ? 1 : 2; 
    // 求出最小值和最大值
    int l = 0, r = n - 1;
    while(l < n && s[l] == 'F') ++l;
    if(l == n)
    {
        // 特殊情况，说明全部都是F
        // 此时一共有n种情况，公差是1, 初始为0
        cout << n << endl;
        for(int i = 0; i < n; ++i) cout << i << endl;
        return 0;
    }
    while(r > l && s[r] == 'F') --r;
    // 开头和末尾总共能够贡献的价值最大值
    int num_f = n - 1 - r + l ;
    // 用贪心法求出价值的最大值和最小值
    // 最大值
    int max_v = num_f, min_v = 0;
    // cout << max_v << ' ' << min_v << endl;
    for(int i = l; i < r; ++i)
        if(s[i] == 'F') s[i] = s[i - 1];
    for(int i = l; i < r; ++i)
        if(s[i] == s[i + 1]) max_v++;
    for(int i = l; i < r; ++i)
        if(str[i] == 'F') s[i] = s[i - 1] == 'B' ? 'E' : 'B';
    for(int i = l; i < r; ++i)
        if(s[i] == s[i + 1]) min_v++;
    // cout << max_v << ' ' << min_v << endl;
    cout << ((max_v - min_v) / d + 1) << endl;
    for(int i = min_v; i <= max_v; i += d)
        cout << i << endl;
    return 0;
}